home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ9203.ZIP / OOPASM.ZIP / MATH.ASM < prev    next >
Assembly Source File  |  1990-05-17  |  4KB  |  295 lines

  1.     .MODEL    SMALL
  2.  
  3.     INCLUDE    equates.inc
  4.  
  5.     .CODE
  6.  
  7. COMMENT    %
  8. ==============================================================================
  9. Convert long integer to string.
  10.  
  11. Passed:    dx,ax - long integer
  12.     es:di - points to area for string
  13.  
  14. =============================================================================%
  15.     PUBLIC  longToString
  16. longToString    PROC      NEAR
  17.     push        bp
  18.     push        di
  19.     push        es
  20.     mov        bp,sp
  21.  
  22.     mov        si,dx
  23.     test        dh,80h
  24.     jz        lts1
  25.     not        dx
  26.     neg        ax
  27.     sbb        dx,-1
  28.  
  29. lts1:    sub        bx,bx
  30.     push        bx
  31.  
  32. lts2:    push        si
  33.     push        dx
  34.     push        ax
  35.     mov        cx,0
  36.     mov        bx,10
  37.     call        lDiv
  38.     pop        bx
  39.     pop        cx
  40.  
  41.     push        dx
  42.     push        ax
  43.     push        cx
  44.     push        bx
  45.     mov        cx,0
  46.     mov        bx,10
  47.     call        lMul
  48.     mov        cx,dx
  49.     mov        bx,ax
  50.     pop        ax
  51.     pop        dx
  52.     call        lSub
  53.     mov        bx,ax
  54.     pop        ax
  55.     pop        dx
  56.     pop        si
  57.     add        bl,'0'
  58.     push        bx
  59.     mov        bx,ax
  60.     or        bx,dx
  61.     jnz        lts2
  62.  
  63.     mov        di,[bp][2]
  64.     mov        es,[bp]
  65.     cld
  66.     test        si,8000h
  67.     jz        lts3
  68.     mov        al,'-'
  69.     stosb
  70.  
  71. lts3:    pop        ax
  72.     stosb
  73.     or         al,al
  74.     jnz        lts3
  75.     mov        sp,bp
  76.     pop        es
  77.     pop        di
  78.     pop        bp
  79.     ret
  80. longToString    ENDP
  81.  
  82.  
  83.  
  84. COMMENT    %
  85. ==============================================================================
  86. Subtracts a long integer from a long integer.
  87.  
  88. Passed:    cx:bx - Number to be subtracted
  89.     dx:ax - Number its subtracted from
  90.  
  91. Passes:    dx:ax - Result
  92.  
  93. =============================================================================%
  94. lSub    PROC    NEAR
  95.     push        ax
  96.     mov        ax,0
  97.     sub        ax,bx
  98.     mov        bx,ax
  99.     mov        ax,0
  100.     sbb        ax,cx
  101.     mov        cx,ax
  102.     pop        ax
  103.     add        ax,bx
  104.     adc        dx,cx
  105.     ret
  106. lSub    ENDP
  107.  
  108.  
  109.  
  110.  
  111. COMMENT    %
  112. ==============================================================================
  113. Long integer multiplier.
  114.  
  115. =============================================================================%
  116. lMul    PROC    NEAR
  117.     push        si
  118.     push        di
  119.     push        bp
  120.     sub        bp,bp
  121.  
  122.     test        dh,80h
  123.     jz        lml1
  124.     not        bp
  125.     mov        si,0
  126.     sub        si,ax
  127.     mov        ax,si
  128.     mov        si,0
  129.     sbb        si,dx
  130.     mov        dx,si
  131.  
  132. lml1:    test        Ch,80h
  133.     jz        lml2
  134.     not        bp
  135.     mov        si,0
  136.     sub        si,bx
  137.     mov        bx,si
  138.     mov        si,0
  139.     sbb        si,cx
  140.     mov        cx,si
  141.  
  142. lml2:    mov        si,dx
  143.     mov        di,ax
  144.     mul        bx
  145.     push        ax
  146.     push        dx
  147.  
  148.     mov        ax,si
  149.     mul        bx
  150.     pop        bx
  151.     add        ax,bx
  152.     adc        dx,0
  153.     push        ax
  154.     mov        bx,dx
  155.  
  156.     mov        ax,di
  157.     mul        cx
  158.     pop        di
  159.     add        di,ax
  160.     push        di
  161.     mov        di,0
  162.     adc        bx,dx
  163.     adc        di,0
  164.  
  165.     mov        ax,si
  166.     mul        cx
  167.     add        ax,bx
  168.     adc        dx,di
  169.     pop        cx
  170.     pop        bx
  171.  
  172.     or        ax,dx
  173.     mov        ax,bx
  174.     mov        dx,cx
  175.     pushf
  176.     test        bp,bp
  177.     jz        lml3
  178.     mov        bx,0
  179.     sub        bx,ax
  180.     mov        ax,bx
  181.     mov        bx,0
  182.     sbb        bx,dx
  183.     mov        dx,bx
  184.  
  185. lml3:    popf
  186.     pop        bp
  187.     pop        di
  188.     pop        si
  189.     jz        lml4
  190.     stc
  191. lml4:    ret
  192. lMul    ENDP
  193.  
  194.  
  195.  
  196.  
  197. COMMENT    %
  198. ==============================================================================
  199. Long integer divider.
  200.  
  201. =============================================================================%
  202. lDiv    PROC    NEAR
  203.     push        bp 
  204.     sub        sp,4 
  205.     mov        bp,sp 
  206.     mov        [bp],cx 
  207.     or        cx,bx 
  208.     jnz        ldv1
  209.     sub        ax,ax
  210.     mov        dx,ax
  211.     jmp        ldv13 
  212.  
  213. ldv1:    mov        [bp+2],dx 
  214.     or        dx,ax
  215.     jnz        ldv2
  216.     jmp        ldv13 
  217.  
  218. ldv2:    mov        cx,[bp] 
  219.     mov        dx,[bp+2] 
  220.     mov        si,dx 
  221.     test        si,si
  222.     jns        ldv3
  223.     not        dx 
  224.     neg        ax 
  225.     sbb        dx,-1   
  226.  
  227. ldv3:    xor        si,cx
  228.     mov        [bp],si
  229.     sub        si,si 
  230.     test        ch,ch 
  231.     jns        ldv4
  232.     not        cx 
  233.     neg        bx 
  234.     sbb        cx,-1
  235.  
  236. ldv4:    jnz        ldv7
  237.     test        bx,bx 
  238.     js        ldv7
  239.     mov        di,20h
  240.  
  241. ldv5:    shl        ax,1 
  242.     rcl        dx,1 
  243.     rcl        si,1 
  244.     cmp        si,bx 
  245.     jb        ldv6
  246.     sub        si,bx 
  247.     inc        ax 
  248.  
  249. ldv6:    dec        di 
  250.     jnz        ldv5 
  251.     sub        cx,cx 
  252.     mov        bx,si 
  253.     jmp        ldv11
  254.  
  255. ldv7:    mov        di,0010h
  256.  
  257. ldv8:    shl        ax,1 
  258.     rcl        dx,1 
  259.     rcl        si,1 
  260.     cmp        si,cx 
  261.     jb        ldv10
  262.     jnz        ldv9
  263.     cmp        dx,bx 
  264.     jb        ldv10
  265.  
  266. ldv9:    sub        dx,bx 
  267.     sbb        si,cx 
  268.     inc        ax
  269.  
  270. ldv10:    dec        di 
  271.     jnz        ldv8
  272.     mov        cx,si 
  273.     mov        bx,dx 
  274.     sub        dx,dx 
  275.  
  276. ldv11:    test        Wptr[bp],8000h
  277.     jz        ldv12 
  278.     not        dx 
  279.     neg        ax 
  280.     sbb        dx,-1
  281.  
  282. ldv12:    test        Wptr[bp+2],8000h
  283.     jz        ldv13
  284.     not        cx 
  285.     neg        bx 
  286.     sbb        cx,-1 
  287.  
  288. ldv13:    add        sp,4 
  289.     pop        bp 
  290.     ret
  291. lDiv    ENDP
  292.  
  293.  
  294.     END
  295.